package com.mgetool.ui;

import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.graphics.GC;

import com.mgetool.ui.drawable.IDrawableListener;
import com.mgetool.ui.drawer.BitmapDrawerParam;
import com.mgetool.ui.drawer.DrawerInterface;



/**
 * 游戏各个组件接口类，游戏中封装的所有组件，都要实现此接口，便于统一的 管理
 * @author wangbin
 *
 */
public interface DrawableInterface {
	
	/**
	 * 按键、鼠标弹起事件
	 */
	public static final int EVENT_STATE_UP = 0x1;
	/**
	 * 按键、鼠标按下事件
	 */
	public static final int EVENT_STATE_DOWN = 0x2;
	/**
	 * 鼠标移动事件
	 */
	public static final int EVENT_STATE_MOVE = 0x4;
	/**
	 * 鼠标双击事件
	 */
	public static final int EVENT_STATE_DOUBLE_CLICK = 0x8;
	
	/**
	 * 相关初始化的操作
	 */
	public abstract void init();
	/**
	 * 按键响应 按下
	 * @param eventState
	 * @param keyEvent
	 * @return
	 */
	public abstract boolean onKey(int eventState, KeyEvent keyEvent);
	
	
	/**
	 * 鼠标事件
	 * @param eventState
	 * @param event
	 * @return
	 */
	public abstract boolean onMouseEvent(int eventState, MouseEvent event);
	
	
	/**
	 * 用于循环更新的一些操作，比如计时相关
	 */
	public abstract void onUpdate();
	/**
	 * 绘制方法
	 * @param canvas
	 * @param paint
	 */
	public abstract void onDraw(GC gc);
	
	/**
	 * 绘制方法
	 * @param canvas
	 * @param x
	 * 			坐标
	 * @param y
	 * @param paint
	 */
	public abstract void onDraw(GC gc, int x, int y);
	
	/**
	 * 判断该组件是否被点击
	 * @param x
	 * @param y
	 * @return
	 */
	public abstract boolean isClicked(int x, int y);
	/**
	 * 该组件被释放前执行此方法，释放组件引用的资源内存
	 */
	public abstract void onDestroy();
	/**
	 * 设置坐标
	 * @param x
	 * @param y
	 */
	public abstract void setPosition(int x, int y);
	/**
	 * 设置坐标区域
	 * @param x
	 * @param y
	 * @param width
	 * @param height
	 */
	public abstract void setBound(int x, int y, int width, int height);
	/**
	 * 该组件的x坐标
	 * @return
	 */
	public abstract int getX();
	/**
	 * 该组件的y坐标
	 * @return
	 */
	public abstract int getY();
	/**
	 * 该组件的宽
	 * @return
	 */
	public abstract int getWidth();
	/**
	 * 该组件的高
	 * @return
	 */
	public abstract int getHeight();
	/**
	 * 设置组件的宽高
	 * @param width
	 * @param height
	 */
	public abstract void setSize(int width, int height);
	
	/**
	 * 设置监听器
	 * @param listener
	 */
	public abstract void setListener(IDrawableListener listener);
	
	/**
	 * 设置是否可以显示
	 * @param isShow
	 */
	public abstract void setShow(boolean isShow);
	
	/**
	 * 当前组件是否显示
	 * @return
	 */
	public abstract boolean isShow();
	
	/**
	 * 设置绘制器
	 * @param drawer
	 */
	public abstract void setDrawer(DrawerInterface drawer);
	
	/**
	 * 得到绘制器
	 * @return
	 */
	public DrawerInterface getDrawer();

	/**
	 * 设置绘制器的参数
	 * @param drawerParam
	 */
	public void setDrawerParam(BitmapDrawerParam drawerParam);
	
}
